package ar.edu.utn.frgp.banco.menu;

import java.util.List;
import java.util.Scanner;

import ar.edu.utn.frgp.banco.domain.Cuenta;
import ar.edu.utn.frgp.banco.domain.Movimientos;

import ar.edu.utn.frgp.banco.domain.Transferencia;


import ar.edu.utn.frgp.banco.exceptions.ServiceException;
import ar.edu.utn.frgp.banco.service.RecursoServiceCuenta;
import ar.edu.utn.frgp.banco.service.RecursoServiceMovimientos;

import ar.edu.utn.frgp.banco.service.RecursoServiceTransferencias;

import ar.edu.utn.frgp.banco.service.impl.RecursoServiceCuentaImpl;
import ar.edu.utn.frgp.banco.service.impl.RecursoServiceMovimientosImpl;

import ar.edu.utn.frgp.banco.service.impl.RecursoServiceTransferenciasImpl;


public class MenuTransferencias {

	public void menuTransferencias() 
	{
		Integer  operacion ;
		Scanner A = new Scanner(System.in);
		do{
			System.out.println(" ");
			System.out.println("1_Realizar Transferencia");
	 		System.out.println("2_Mostrar transferencias por cuenta");
	 		System.out.println("3_Listar Tranferencias");
	 		System.out.println("0_Volver al Menu Principal");
	 	    System.out.println(" ");
	 		System.out.println("Ingrese una Opcion: ");
	 		operacion = A.nextInt();
			
	 		RecursoServiceTransferencias serviceTransferencias = new RecursoServiceTransferenciasImpl();
	 		Movimientos regMovimientoorigen = new Movimientos();
	 		Movimientos regMovimientodestino = new Movimientos();
			RecursoServiceMovimientos serviceMovimientos = new RecursoServiceMovimientosImpl();
			
			switch(operacion)
				{
			   ///////////////////////////////////////////////////////////////////
				case 1: 
					
					Cuenta cuorigen = new Cuenta();
					Cuenta cudestino = new Cuenta();
					Transferencia regTransferencia = new Transferencia();
					
					RecursoServiceCuenta serviceCuenta = new RecursoServiceCuentaImpl();
					
					
					int  dniCliente;
					int  cuentaClienteOrigen;
					int  cuentaClienteDestino;
					double monto;

					Scanner dni = new Scanner(System.in);
					Scanner cuentaOrigen = new Scanner(System.in);
					Scanner cuentaDestino = new Scanner(System.in);
					Scanner montoTransferencia = new Scanner(System.in);
					
					System.out.println("Ingrese el dni del cliente que Realizara la Transferencia");
					dniCliente = dni.nextInt();
					
					// lista las cuentas del cliente ingresado
					try {
						List<Cuenta> cuentas = serviceCuenta.listarCuentasActivas(dniCliente);
						
							for (Cuenta c: cuentas){
								System.out.println("");
								 System.out.println("dni "+ c.getDni());
								 System.out.println("nro cuenta "+ c.getNrocuenta());
								 System.out.println("tipo cuenta "+ c.getTipoCuenta());
								 System.out.println("estado "+ c.getEstado());
								 System.out.println("saldo "+ c.getSaldo());
								 System.out.println("descubierto "+ c.getDescubierto());
								 System.out.println("");
							}
						  } catch (ServiceException e) {
						  System.out.println("Error al listar todas las Cuentas . " + e.getMessage());
					}
					
					
					//pide que elija un numero de cuenta
					System.out.println("Ingrese el numero de cuenta de Origen de La transferencia");
					cuentaClienteOrigen = cuentaOrigen.nextInt();
					
					//pide que elija un numero de cuenta
					System.out.println("Ingrese el numero de cuenta de Destino de La transferencia");
					cuentaClienteDestino = cuentaDestino.nextInt();

					
					// pide que elija el monto a transferir
					System.out.println("Ingrese el Monto de la Transferencia");
					monto = montoTransferencia.nextDouble();
									
					///// busca las cuentas y modifica el saldo 
				try {
					cuorigen = serviceCuenta.buscarCuenta(cuentaClienteOrigen); //busco y traigo la cuenta de la cual se va a debitar el monto
					cudestino = serviceCuenta.buscarCuenta(cuentaClienteDestino); //busco y traigo la cuenta a la cual se dirige el monto

					cuorigen.setSaldo(cuorigen.getSaldo()- monto);// modifico el saldo de esa cuenta (saldo de la cuenta - monto )
					cudestino.setSaldo(cudestino.getSaldo()+ monto);// modifico el saldo de esa cuenta (saldo de la cuenta + monto )
					
					serviceCuenta.modificarSaldoCuenta(cuorigen);/// le mando a modificar saldo cuenta la cuenta con el saldo modificado
					serviceCuenta.modificarSaldoCuenta(cudestino);/// le mando a modificar saldo cuenta la cuenta con el saldo modificado
					
					regTransferencia.cargarTransferencia(cuentaClienteOrigen, cuentaClienteDestino, monto);
					serviceTransferencias.registrarTransferencia(regTransferencia);
					
					regMovimientoorigen.cargarMovimiento(cuentaClienteOrigen, 1, 2, cuorigen.getSaldo(),monto );
					serviceMovimientos.registrarMovimiento(regMovimientoorigen);
					
					regMovimientodestino.cargarMovimiento(cuentaClienteDestino, 2, 2, cudestino.getSaldo(),monto );
					serviceMovimientos.registrarMovimiento(regMovimientodestino);
					
					
				} catch (ServiceException e2) {
					// TODO Auto-generated catch block
					e2.printStackTrace();
				}
									
				
					
				break;
				////////////////////////////////////////////////////////////////
				case 2: 
				break;
			    ////////////////////////////////////////////////////////////////////		
				case 3:
					
										
					System.out.println("1. Listado de Transferencias" );
					
					
					try {
						
						List<Transferencia> transferencias = serviceTransferencias.listarTransferencias();
						
						for (Transferencia c: transferencias){
							System.out.println("");
							System.out.println("Id transferencia: " + c.getIdtransferencia());
							System.out.println("nro cuenta origen: " + c.getNrocuentaorigen());
							System.out.println("nro cuenta destino: " + c.getNrocuentadestino());
							System.out.println("fecha: " + c.getFecha());
							System.out.println("monto: " + c.getMonto());
							System.out.println("");
						}
						
						
					} catch (ServiceException e) {
						System.out.println("Error al listar los servicios pagos . " + e.getMessage());
					}
					
				break;
				///////////////////////////////////////////////////////////////////////////
				case 4:
				break;
				///////////////////////////////////////////////////////////////////////////
				case 5: 
				break;
				};		  
				
		}while(operacion != 0);
		
	}
}
